/*
*
*    This program is free software; you can redistribute it and/or modify it
*    under the terms of the GNU General Public License as published by the
*    Free Software Foundation; either version 2 of the License, or (at
*    your option) any later version.
*
*    This program is distributed in the hope that it will be useful, but
*    WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
*    General Public License for more details.
*
*    You should have received a copy of the GNU General Public License
*    along with this program; if not, write to the Free Software Foundation,
*    Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*
*    In addition, as a special exception, the author gives permission to
*    link the code of this program with the Half-Life Game Engine ("HL
*    Engine") and Modified Game Libraries ("MODs") developed by Valve,
*    L.L.C ("Valve").  You must obey the GNU General Public License in all
*    respects for all of the code used other than the HL Engine and MODs
*    from Valve.  If you modify this file, you may extend this exception
*    to your version of the file, but you are not obligated to do so.  If
*    you do not wish to do so, delete this exception statement from your
*    version.
*
*/
#include "events.h"
#include "studio.h"
#include "r_studioint.h"
#include <string>

namespace cl {

extern engine_studio_api_t IEngineStudio;

enum gatling_e
{
	GATLING_IDLE,
	GATLING_FIRE1,
	GATLING_FIRE2,
	GATLING_RELOAD,
	GATLING_DRAW,
	GATLINGEX_FIREBALL
};

static const char* SOUNDS_NAME[] =
{
	"weapons/gatlingex-1.wav", "weapons/gatlingex-2.wav"
};

void EV_FireGatlingex(event_args_s* args)
{
	vec3_t ShellVelocity;
	vec3_t ShellOrigin;
	vec3_t vecSrc, vecAiming;
	int    idx = args->entindex;
	Vector origin(args->origin);
	Vector angles(
		args->iparam1 / 100.0f + args->angles[0],
		args->iparam2 / 100.0f + args->angles[1],
		args->angles[2]
	);
	Vector velocity(args->velocity);
	Vector forward, right, up;

	AngleVectors(angles, forward, right, up);
	if (args->bparam2)
	{
		if (args->bparam1)
		{
			struct model_s* pModel = IEngineStudio.Mod_ForName("sprites/ef_gatlingex_explosion.spr", false);
			if (pModel)
			{
				gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_WEAPON, "weapons/gatlingex-2_exp.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				TEMPENTITY* pEnt = gEngfuncs.pEfxAPI->CL_TempEntAllocHigh(origin, pModel);
				pEnt->entity.curstate.frame = 0;
				pEnt->entity.curstate.framerate = 30.0;

				pEnt->entity.curstate.scale = 1.0;
				pEnt->entity.curstate.rendermode = kRenderTransAdd;
				pEnt->entity.curstate.renderamt = 255;
				pEnt->die = gHUD.m_flTime + 1.33;
				pEnt->flags |= FTENT_SPRANIMATE;

			}
		}
		else
		{
			gEngfuncs.pEventAPI->EV_WeaponAnimation(GATLINGEX_FIREBALL, 2);
			PLAY_EVENT_SOUND(SOUNDS_NAME[1]);
		}
	}
	else
	{
		if (EV_IsLocal(idx))
		{

			++g_iShotsFired;
			EV_MuzzleFlash();
			gEngfuncs.pEventAPI->EV_WeaponAnimation(Com_RandomLong(GATLING_FIRE1, GATLING_FIRE2), 2);
			if (!gHUD.cl_righthand->value)
			{
				EV_GetDefaultShellInfo(args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 22.0, -9.0, -11.0, 0);
			}
			else
			{
				EV_GetDefaultShellInfo(args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 22.0, -9.0, 11.0, 0);
			}
		}
		else
		{
			EV_GetDefaultShellInfo(args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 20.0, -12.0, 4.0, 0);
		}

		EV_EjectBrass(ShellOrigin, ShellVelocity, angles[YAW], g_iShotgunShell, TE_BOUNCE_SHELL);

		PLAY_EVENT_SOUND(SOUNDS_NAME[0]);

		EV_GetGunPosition(args, vecSrc, origin);
		VectorCopy(forward, vecAiming);
		Vector vSpread;

		vSpread.x = 0.0725;
		vSpread.y = 0.0725;
		EV_HLDM_FireBullets(idx,
			forward, right, up,
			6, vecSrc, vecAiming,
			vSpread, 8192.0, BULLET_PLAYER_BUCKSHOT,
			1);
	}
}
}
